package main

import (
	"gin-zc/util"
	"log"
	"net/http"
	"reflect"

	"gin-zc/config"
	"gin-zc/controller"
	"gin-zc/middleware"
	"gin-zc/repository"

	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"github.com/go-playground/locales/zh"
	ut "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
	"go.uber.org/zap"

	// ... 其他包
	zhTrans "github.com/go-playground/validator/v10/translations/zh"
)

func main() {
	// 1. 初始化日志（写入文件）
	// 初始化按日期分割的日志
	util.InitDailyLog()
	defer util.AppLogger.Sync()
	defer util.SqlLogger.Sync()
	//util.InitFileLogger()
	//defer util.Logger.Sync() // 确保日志刷新到文件
	//defer util.SqlLogger.Sync()

	// 1. 初始化配置
	cfg := config.Init()

	// 2. 初始化Redis（使用配置中的Timeout）
	if err := util.InitRedis(cfg); err != nil {
		log.Fatalf("Redis初始化失败: %v", err)
	}

	// 2. 初始化数据库
	if err := repository.InitDB(cfg); err != nil {
		util.Logger.Fatal("数据库初始化失败", zap.Error(err))
	}

	// 3. 创建Gin引擎
	r := gin.Default()                       // 包含日志和恢复中间件
	r.Use(gin.Recovery())                    // 捕获panic，避免服务崩溃
	r.Use(middleware.RequestLogMiddleware()) // 注册请求日志中间件

	// 1. 初始化中文翻译器
	zh := zh.New()
	uni := ut.New(zh, zh)
	trans, _ := uni.GetTranslator("zh")

	// 2. 获取Gin默认的validator引擎
	if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
		// 3. 注册中文翻译
		_ = zhTrans.RegisterDefaultTranslations(v, trans)

		// 4. 自定义字段名翻译（将结构体字段名映射为中文，如"Username"→"用户名"）
		v.RegisterTagNameFunc(func(field reflect.StructField) string {
			// 从json标签中获取字段名（如json:"username"→"username"）
			name := field.Tag.Get("json")
			// 可在此处手动映射为中文，如：
			// if name == "username" { return "用户名" }
			return name
		})

		// 5. 将翻译器存入Gin上下文，供控制器使用
		r.Use(func(c *gin.Context) {
			c.Set("trans", trans)
			c.Next()
		})
	}

	// 4. 全局配置（如CORS，允许前端跨域请求）,全局应用配置中间件（关键步骤）-所有请求都会经过该中间件，将config存入上下文
	r.Use(corsMiddleware(), middleware.ConfigMiddleware(cfg))

	// 5. 注册路由
	api := r.Group("/api/v1")
	{
		// 公开接口（无需认证）
		api.POST("/register", controller.Register)
		api.POST("/login", controller.Login)
		api.GET("/user/:id", controller.GetUser)

		// 需认证的接口（使用AuthMiddleware）
		auth := api.Group("/")
		auth.Use(middleware.AuthMiddleware(cfg)) // 应用认证中间件
		{
			auth.GET("/user/info", controller.GetUserInfo) // 获取个人信息
		}
	}

	// 6. 启动服务
	log.Println("server running on :8080")
	log.Fatal(r.Run(":8080"))
}

// corsMiddleware 处理跨域请求
func corsMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.Header("Access-Control-Allow-Origin", "*") // 生产环境需指定具体域名
		c.Header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
		c.Header("Access-Control-Allow-Headers", "Origin, Content-Type, Authorization")
		if c.Request.Method == "OPTIONS" {
			c.AbortWithStatus(http.StatusOK)
			return
		}
		c.Next()
	}
}
